#ifndef MODBUS_MY_H
#define MODBUS_MY_H
#include <stdio.h>
#include <modbus.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <string.h>

#define true 1
#define false 0;

char mb_slave_ip[64]={}; //用于存储modbusslave的ip地址
int mb_slave_port=0; //用于存储modbusslave的端口号
uint8_t coils[2]={}; //用于存储线圈状态
uint16_t inputs[4]={}; //用于存储保持寄存器
static struct shm_param para; //用于存储共享内存参数

typedef int bool;

typedef union val_t //用于存储modbus数据采集结构体中的old_val和new_val
{

    int b_val;
    int i_val;
    float f_val;
}val_t;

typedef struct std_node
{
    int key;             // 唯一键值
    int type;            // 数据点类型
    int dev_type;        // 数据点属于哪个设备，根据网关支持的设备自行定义
    val_t old_val; // 变化上报后需要更新旧值
    val_t new_val; // 从共享内存取出最新数据，放到new_val中
    int ret;             // 默认为-1，采集成功后设置为0，采集失败再置-1
}std_node;

typedef struct msgqueue  //消息队列结构体
{
    long mtype;
    int key;      // 消息类型/编号
    char mdata[256]; // 消息数据
}msgqueue;

static int *total;                       // 指向共享内存中数据节点总个数
static struct std_node *node_arr = NULL; // 指向共享内存中节点缓存数组头
static struct std_node *mb_arr = NULL;   // 指向自己结构体中节点缓存数组头
#define MAX_NODE 100                      // 最大支持设别数目，实际可用是127
#define STD_NODE_SIZE sizeof(struct std_node)
#define ALL_NODE_SIZE STD_NODE_SIZE*(*total)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

#endif